﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ServiceModel;
using System.Runtime.Serialization;

namespace DC.DCHierarchy.Demo
{

    /*
     * DataContract是不可以继承的，Serializable是可以继承的。
     * 
     * 1. 对于DataContract，它的每一级数据契约都必须标记DataContract。
     *      如果类层级中的某个层级没有指定为可序列化的或者数据契约，就会引发InvaildDataContractException异常。
     * 
     * 2. 对于Serializable，因为WCF允许在类的层级中混合使用Serializable和DataContract特性。
     *      因此通常会被用到类层级的基类上。例如：Contact类与Address类
     *      
     * 3.导出数据契约层级时，元数据会维持它的层级体系。使用服务契约的子类时，会导出类层级的每级数据契约定义：
     *      例如AddContact方法 Address也将被同时导出。
     */

    [Serializable]
    public class Address
    {       
        public string Country { get; set; }
        public string Province { get; set; }
        public string City { get; set; }
        public string Street { get; set; }
    }

    [DataContract]
    public class Contact : Address
    {
        [DataMember]
        public string FirstName { get; set; }
        [DataMember]
        public string LastName { get; set; }
        [DataMember]
        public string PhoneNumber { get; set; }
        [DataMember]
        public string CarNumber { get; set; }
        [DataMember]
        public Address Address { get; set; }
    }

    [ServiceContract]
    public interface IServiceContract
    {
        [OperationContract]
        void AddContact(Contact contact);//Address也将被同时导出
    }
}
